from openpyxl import load_workbook
import os
from openai import OpenAI
from tqdm import tqdm
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
from openpyxl import load_workbook

'''
自动生成C#类
'''

prompt = '''
我正在写代码，现在有同事给了我一个表格，里面有很多变量的中文含义。
我需要写一个类出来，但是我一个一个去将变量的中文含义翻译为英文太麻烦了。
我将给你一个变量的中文含义，你需要以英文的形式回答代码中合适的变量的定义，变量的命名需要严格按照驼峰命名规则。
注意只需要回答最合适的驼峰英文变量名，不要回答其他任何内容。
示例1：
问：变量名中文含义：行走速度
答：moveSpeed
示例2：
问：变量名中文含义：货叉速度
答：forkSpeed
'''
query_prompt = '代码中的变量名：{}'

client = OpenAI(
    # 若没有配置环境变量，请用百炼API Key将下行替换为：api_key="sk-xxx",
    api_key="sk-a04eb0a42f294863b0d98900bd879e29",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

def get_data_name(origin_name):
    completion = client.chat.completions.create(
        model="qwen-plus",  # 模型列表：https://help.aliyun.com/zh/model-studio/getting-started/models
        messages=[
            {'role': 'system', 'content': prompt},
            {'role': 'user', 'content': query_prompt.format(origin_name)}],
    )

    return completion.choices[0].message.content



class ExcelReaderApp:
    def __init__(self, root):
        self.root = root
        self.root.title("数字孪生实时数据采集系统")

        # 上传文件路径变量
        self.file_path = tk.StringVar()

        # 创建UI界面
        self.create_widgets()

    def create_widgets(self):
        # 文件选择框
        tk.Label(self.root, text="选择 Excel 文件：").grid(row=0, column=0, padx=5, pady=5, sticky="e")
        tk.Entry(self.root, textvariable=self.file_path, width=50).grid(row=0, column=1, padx=5, pady=5)
        tk.Button(self.root, text="浏览", command=self.upload_file).grid(row=0, column=2, padx=5, pady=5)

        # 输入框
        self.sheet_name = tk.StringVar()
        self.start_row = tk.StringVar()
        self.end_row = tk.StringVar()
        self.field_col = tk.StringVar()
        self.type_col = tk.StringVar()

        tk.Label(self.root, text="Sheet 页：").grid(row=1, column=0, padx=5, pady=5, sticky="e")
        tk.Entry(self.root, textvariable=self.sheet_name).grid(row=1, column=1, padx=5, pady=5)

        tk.Label(self.root, text="起始行：").grid(row=2, column=0, padx=5, pady=5, sticky="e")
        tk.Entry(self.root, textvariable=self.start_row).grid(row=2, column=1, padx=5, pady=5)

        tk.Label(self.root, text="结束行：").grid(row=3, column=0, padx=5, pady=5, sticky="e")
        tk.Entry(self.root, textvariable=self.end_row).grid(row=3, column=1, padx=5, pady=5)

        tk.Label(self.root, text="字段名所在列：").grid(row=4, column=0, padx=5, pady=5, sticky="e")
        tk.Entry(self.root, textvariable=self.field_col).grid(row=4, column=1, padx=5, pady=5)

        tk.Label(self.root, text="字段类型所在列：").grid(row=5, column=0, padx=5, pady=5, sticky="e")
        tk.Entry(self.root, textvariable=self.type_col).grid(row=5, column=1, padx=5, pady=5)

        # 进度条
        self.progress = ttk.Progressbar(self.root, orient="horizontal", mode="determinate", length=300)
        self.progress.grid(row=6, column=0, columnspan=3, pady=5)

        # 提交按钮
        tk.Button(self.root, text="开始生成S7类", command=self.read_excel).grid(row=7, column=0, columnspan=3, pady=10)

    def upload_file(self):
        """打开文件选择对话框，上传 Excel 文件"""
        file_path = filedialog.askopenfilename(
            title="选择 Excel 文件",
            filetypes=[("Excel 文件", "*.xlsx *.xls")]
        )
        if file_path:
            self.file_path.set(file_path)

    def read_excel(self):
        file_path = self.file_path.get()
        sheet_name = self.sheet_name.get()
        start_row = int(self.start_row.get())
        end_row = int(self.end_row.get())
        field_col = self.field_col.get()
        type_col = self.type_col.get()

        # 加载 Excel 文件
        wb = load_workbook(file_path)
        sheet = wb[sheet_name]
        data_type_dict = {
            'DInt': 'int',
            'Int': 'short',
            'Bool': 'bool',
            'Real': 'float'
        }
        result_str = ''

        # 初始化进度条
        total_items = end_row - start_row + 1
        self.progress["maximum"] = total_items

        for i in tqdm(range(start_row, end_row + 1)):
            # 字段名和类型
            excel_data_type = sheet[f"{type_col}{i}"].value
            data_type = data_type_dict.get(excel_data_type, "unknownType")
            excel_data_name = sheet[f"{field_col}{i}"].value
            data_name = get_data_name(excel_data_name)

            # 拼接生成代码
            result_str += f'// {excel_data_name}\n'
            result_str += f'public {data_type} {data_name} {{ get; set; }}\n'

            # 更新进度条
            self.progress["value"] = i - start_row + 1
            self.root.update_idletasks()

        # 保存生成结果
        with open('output.txt', 'w', encoding='utf-8') as file:
            file.write(result_str)

        messagebox.showinfo("完成", "S7类生成完成！")

# 主程序入口
if __name__ == "__main__":
    root = tk.Tk()
    app = ExcelReaderApp(root)
    root.mainloop()
